This file contains statistics and figures from the paper, “Molecular, Cellular, and Developmental Organization of the Mouse Vomeronasal organ at Single Cell Resolution” by Max Hills Jr., Limei Ma, Ai Fang, Thelma Chiremba, Seth Malloy, Allison Scott, Anoja Perera, and C. Ron Yu.

The paper can be found here:

Molecular, Cellular, and Developmental Organization of the Mouse Vomeronasal organ at Single Cell Resolution



Axon guidance molecules associated with receptor genes

Correlation heatmap between receptor types calculated from co-expressed AG and TF genes

3D Heatmap showing the Jaccard Indices between AG and TF genes for each of the VRs in the dataset

Interactive 3D Heatmap VR-AG-TF Jaccard Indices

Heatmaps showing Jaccard Indices of TF-AG associations for V1R and V2R types. The lists of TF and AG genes here are abridged from the full list to enhance visualization

Data Tables

Significant VR co-expression

Significant VR / AG Co-expression

Significant VR / TF Co-expression

VR-specific AG / TF co-expression

V1R_iVSN vs V2R_iVSN differentially expressed genes (DEGs)

V1R_mVSN vs V2R_mVSN DEGs

sVSN vs V1R_mVSN DEGs

sVSN vs V2R_mVSN DEGs

Early INP - V1R vs V2R

Late INP - V1R vs V2R

LS0tCnRpdGxlOiAiVk5PIFBhcGVyIEZpZ3VyZXMiCmF1dGhvcjogIk1heCBIaWxscyIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgo+VGhpcyBmaWxlIGNvbnRhaW5zIHN0YXRpc3RpY3MgYW5kIGZpZ3VyZXMgZnJvbSB0aGUgcGFwZXIsICJNb2xlY3VsYXIsIENlbGx1bGFyLCBhbmQgRGV2ZWxvcG1lbnRhbCBPcmdhbml6YXRpb24gb2YgdGhlIE1vdXNlIFZvbWVyb25hc2FsIG9yZ2FuIGF0IFNpbmdsZSBDZWxsIFJlc29sdXRpb24iIGJ5IE1heCBIaWxscyBKci4sIExpbWVpIE1hLCBBaSBGYW5nLCBUaGVsbWEgQ2hpcmVtYmEsIFNldGggTWFsbG95LCBBbGxpc29uIFNjb3R0LCBBbm9qYSBQZXJlcmEsIGFuZCBDLiBSb24gWXUuICAgIAoKVGhlIHBhcGVyIGNhbiBiZSBmb3VuZCBoZXJlOiAgCgpbTW9sZWN1bGFyLCBDZWxsdWxhciwgYW5kIERldmVsb3BtZW50YWwgT3JnYW5pemF0aW9uIG9mIHRoZSBNb3VzZSBWb21lcm9uYXNhbCBvcmdhbiBhdCBTaW5nbGUgQ2VsbCBSZXNvbHV0aW9uXShodHRwczovL2VsaWZlc2NpZW5jZXMub3JnL3Jldmlld2VkLXByZXByaW50cy85NzM1NiN0YWItY29udGVudCkKCioqKiAgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KCiMgUi1NYXJrZG93biBHbG9iYWwgU2V0dGluZ3MgIAoKIyBTZXQtdXAgYSBkZWZhdWx0IGltYWdlIHNpemUgb2YgMTAgWCAxMCBpbmNoZXMuIFN1cHByZXNzIHdhcm5pbmcKIyBhbmQgZXJyb3IgbWVzc2FnZXMuIEhpZGUgY29kZS4Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGNvbW1lbnQ9IiIsCiAgICAgICAgICAgICAgICAgICAgICBlcnJvcj1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEwLCBjYWNoZT1GQUxTRSkKCmBgYAoKYGBge3IgbGlicmFyaWVzLCBpbmNsdWRlPUZBTFNFfQoKIyBMaWJyYXJ5IExvYWRpbmcgIAoKc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKHsKICBsaWJyYXJ5KGtpdCk7IGxpYnJhcnkodGlkeXZlcnNlKTsgbGlicmFyeShzdHJpbmdyKTsgbGlicmFyeShwbG90M0QpIAogIGxpYnJhcnkoZ2dwbG90Mik7IGxpYnJhcnkoZGF0YS50YWJsZSk7IGxpYnJhcnkob3JnLk1tLmVnLmRiKQogIGxpYnJhcnkoZHBseXIpOyBsaWJyYXJ5KFNldXJhdCk7IGxpYnJhcnkoREJJKTsgbGlicmFyeShjb3dwbG90KQogIGxpYnJhcnkoTWF0cml4KTsgbGlicmFyeShnbG1HYW1Qb2kpOyBsaWJyYXJ5KGNpcmNsaXplKQogIGxpYnJhcnkodGliYmxlKTsgbGlicmFyeShnZ3B1YnIpOyBsaWJyYXJ5KHN2Z2xpdGUpOyBsaWJyYXJ5KGdnc2lnbmlmKQogIGxpYnJhcnkoc3RhdHMpOyBsaWJyYXJ5KHZlZ2FuKTsgbGlicmFyeShzY2FsZXMpOyBsaWJyYXJ5KGNhcmV0KQogIGxpYnJhcnkocGF0Y2h3b3JrKTsgbGlicmFyeShwbG90bHkpOyBsaWJyYXJ5KGdlb210ZXh0cGF0aCkKICBsaWJyYXJ5KG9wZW54bHN4KTsgbGlicmFyeShncmlkRXh0cmEpOyBsaWJyYXJ5KGdncmVwZWwpCiAgbGlicmFyeShHZW5lT3ZlcmxhcCk7IGxpYnJhcnkoYmlvbWFSdCk7IGxpYnJhcnkoZ2dwb2ludGRlbnNpdHkpCiAgbGlicmFyeShzbGluZ3Nob3QpOyBsaWJyYXJ5KHRyYWRlU2VxKTsgbGlicmFyeShTaW5nbGVDZWxsRXhwZXJpbWVudCkKICBsaWJyYXJ5KHZpcmlkaXMpOyBsaWJyYXJ5KFVwU2V0Uik7IGxpYnJhcnkocGhlYXRtYXApOyBsaWJyYXJ5KG1zaWdkYnIpCiAgbGlicmFyeShmZ3NlYSk7IGxpYnJhcnkoZ3JpZCk7IGxpYnJhcnkoSURQbWlzYyk7IGxpYnJhcnkoTUFTUykKICBsaWJyYXJ5KFJtaXNjKTsgbGlicmFyeShnZ3Bsb3RpZnkpOyBsaWJyYXJ5KGdncG1pc2MpOyBsaWJyYXJ5KHNjYWxlcykKICBsaWJyYXJ5KGhlYXRtYXBseSk7IGxpYnJhcnkoZGVuZGV4dGVuZCkKfSkKCmBgYAoKYGBge3J9CgojIEdsb2JhbCBWYXJpYWJsZXMKCiMgVGhlIGhvbWUgZGlyZWN0b3J5CmhvbWVfZGlyIDwtICIvbC9ZdS9ZdUxhYi9CaW9pbmZvcm1hdGljcy9wcm9qZWN0cy9taGgvc2NfVk5PLyIKIyBEaXJlY3RvcnkgZm9yIHN0b3JpbmcgZGF0YSBvYmplY3RzIGF0IGNydWNpYWwgc3RhZ2VzCm9iamVjdF9kaXIgPC0gcGFzdGUwKGhvbWVfZGlyLCJmaW5hbC5zZXUub2Jqcy8iKQojIERpcmVjdG9yeSBmb3IgaW1hZ2VzIGZyb20gdGhlIGZpbmFsIGFuYWx5c2lzCmltYWdlX2RpciA8LSBwYXN0ZTAoaG9tZV9kaXIsImZpbmFsX2ltYWdlcy8iKQphZG9iZV9pbWFnZXMgPC0gcGFzdGUwKGltYWdlX2RpciwgImFkb2JlX2lsbHVzdHJhdG9yX3N2Z19maWxlcy8iKQojIERpcmVjdG9yeSBmb3IgaW1hZ2VzIGZvciB0aGUgZmluYWwgcGFwZXIKY2x1c3RyZWVfZGlyIDwtIHBhc3RlMChpbWFnZV9kaXIsImNsdXN0cmVlLyIpCiMgQSBkaXJlY3RvcnkgZm9yIFRyYWRlU2VxIGZpdEdBTSBvdXRwdXQKZml0R0FNX2RpciA8LSBwYXN0ZTAob2JqZWN0X2RpciwgImZpdEdBTS8iKQptb2VfZGlyIDwtICIvbC9ZdS9ZdUxhYi9CaW9pbmZvcm1hdGljcy9wcm9qZWN0cy9taGgvbW9sbmdfMjQwN18yNDUzL1Jfb2JqLyIKCiMgT1BFTiBgYGB2bm8uc2V1LmludGVncmF0ZWRgYGAKbG9hZChmaWxlID0gcGFzdGUwKG9iamVjdF9kaXIsInZuby5pbnRlZ3JhdGVkLnBvc3RDZWxsSUQiKSkKI0xvYWQgTmV1cm9uYWwgTGluZWFnZSBTZXVyYXQgT2JqZWN0ICAKbG9hZChmaWxlID0gcGFzdGUwKG9iamVjdF9kaXIsIm5ldXJvbi5pbnRlZ3JhdGVkLnBvc3RDZWxsSUQiKSkKCiMgUmVuYW1lIHVua25vd25fbVZTTiB0byBzVlNOCmxldmVscyh2bm8uc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KVtsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudClbbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZCRjZWxsX3R5cGUpW2xldmVscyh2bm8uc2V1LmludGVncmF0ZWQkY2VsbF90eXBlKT09InVua25vd25fbVZTTiJdIDwtICJzVlNOIgpsZXZlbHMobmV1cm9uLmludGVncmF0ZWQkY2VsbF90eXBlKVtsZXZlbHMobmV1cm9uLmludGVncmF0ZWQkY2VsbF90eXBlKT09InVua25vd25fbVZTTiJdIDwtICJzVlNOIgoKIyBHZXQgY29sb3Igc2NoZW1lIGZvciB0aGUgd2hvbGUgdm5vIGRhdGFzZXQKdm5vLmNlbGxfdHlwZS5jb2xvcnMgPC0gaHVlX3BhbCgpKGxlbmd0aChsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCkpKQpuYW1lcyh2bm8uY2VsbF90eXBlLmNvbG9ycykgPC0gbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpCgojIEtlZXAgbmV1cm9uIGRhdGFzZXQgY29sb3Igc2NoZW1lIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2hvbGUgdm5vIGNvbG9yIHNjaGVtZSwgd2hlcmUgcG9zc2libGUgIApuZXVyb24uY2VsbF90eXBlLmNvbG9ycyA8LSB2bm8uY2VsbF90eXBlLmNvbG9yc1tjKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iLCJWMVJfaVZTTiIsIlYyUl9pVlNOIiwiR0JDIildCm5ldXJvbi5jZWxsX3R5cGUuY29sb3JzIDwtIHNldE5hbWVzKGMobmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMsIiMwMEIwRjYiLCIjOTU5MEZGIiwiI0U3NkJGMyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKG5hbWVzKG5ldXJvbi5jZWxsX3R5cGUuY29sb3JzKSwiaU9TTiIsImxhdGVfSU5QIiwiZWFybHlfSU5QIikpCgptYXR1cmUubmV1cm9ucyA8LSBzdWJzZXQobmV1cm9uLmludGVncmF0ZWQsaWRlbnRzPWMoIlYxUl9tVlNOIiwiVjJSX21WU04iLCJtT1NOIiwic1ZTTiIpKQptYXR1cmUuY2VsbF90eXBlLmNvbG9ycyA8LSBuZXVyb24uY2VsbF90eXBlLmNvbG9yc1tjKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iKV0KCmdsb2JhbC52YXJzIDwtIGMobHMoKSwiZ2xvYmFsLnZhcnMiKQoKYGBgCgoqKiogIAoKIyBBeG9uIGd1aWRhbmNlIG1vbGVjdWxlcyBhc3NvY2lhdGVkIHdpdGggcmVjZXB0b3IgZ2VuZXMgey50YWJzZXQgLnRhYnNldC1waWxsc30gIAoKYGBge3J9CgojIExvYWQgdGhlIHNpZ25pZmljYW50IGNvLWV4cHJlc3Npb24gZGF0YSBmcmFtZXMKc2lnLnZyLmNvZXhwcmVzc2lvbiA8LSBvcGVueGxzeDo6cmVhZC54bHN4KHhsc3hGaWxlPXBhc3RlMChvYmplY3RfZGlyLCJzaWcubVZTTi5jby54bHN4IikpCnJvd25hbWVzKHNpZy52ci5jb2V4cHJlc3Npb24pIDwtIHBhc3RlKHNpZy52ci5jb2V4cHJlc3Npb24kc2V0QSxzaWcudnIuY29leHByZXNzaW9uJHNldEIsc2VwPSJfIikKc2lnLnZyLmFnLmNvZXhwcmVzc2lvbiA8LSBvcGVueGxzeDo6cmVhZC54bHN4KHhsc3hGaWxlPXBhc3RlMChvYmplY3RfZGlyLCJzaWcudnIuYWcuY29leHByZXNzaW9uLnhsc3giKSkKcm93bmFtZXMoc2lnLnZyLmFnLmNvZXhwcmVzc2lvbikgPC0gcGFzdGUoc2lnLnZyLmFnLmNvZXhwcmVzc2lvbiRzZXRBLHNpZy52ci5hZy5jb2V4cHJlc3Npb24kc2V0QixzZXA9Il8iKQpzaWcudnIudGYuY29leHByZXNzaW9uIDwtIG9wZW54bHN4OjpyZWFkLnhsc3goeGxzeEZpbGU9cGFzdGUwKG9iamVjdF9kaXIsInNpZy52ci50Zi5jb2V4cHJlc3Npb24ueGxzeCIpKQpyb3duYW1lcyhzaWcudnIudGYuY29leHByZXNzaW9uKSA8LSBwYXN0ZShzaWcudnIudGYuY29leHByZXNzaW9uJHNldEEsc2lnLnZyLnRmLmNvZXhwcmVzc2lvbiRzZXRCLHNlcD0iXyIpCnZyLmFnX3RmLnJlc3VsdHMgPC0gb3Blbnhsc3g6OnJlYWQueGxzeCh4bHN4RmlsZT1wYXN0ZTAob2JqZWN0X2RpciwidnIuYWdfdGYucmVzdWx0cy54bHN4IikpCnJvd25hbWVzKHZyLmFnX3RmLnJlc3VsdHMpIDwtIHBhc3RlKHZyLmFnX3RmLnJlc3VsdHMkc2V0QSx2ci5hZ190Zi5yZXN1bHRzJHNldEIsc2VwPSJfIikKCiMgTG9hZCB0aGUgZ2VuZSBuYW1lcyBmb3IgZWFjaCBjYXRlZ29yeQp2ci5uYW1lcyA8LSByZWFkUkRTKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsImZpbmFsLnJlY2VwdG9yLm5hbWVzLnJkcyIpKQphZy5uYW1lcyA8LSByZWFkUkRTKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsImZpbmFsLm1lbWJyYW5lX2FnLm5hbWVzLnJkcyIpKQp0Zi5uYW1lcyA8LSByZWFkUkRTKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsImZpbmFsLmRuYV9iaW5kaW5nX3RmLm5hbWVzLnJkcyIpKQoKYGBgCgpgYGB7cn0KClZScyA8LSB1bmlxdWUoc29ydCh2ci5hZ190Zi5yZXN1bHRzJFZSKSkKQUdzIDwtIHVuaXF1ZShzb3J0KHZyLmFnX3RmLnJlc3VsdHMkQUcpKQpURnMgPC0gdW5pcXVlKHNvcnQodnIuYWdfdGYucmVzdWx0cyRURikpCgpgYGAKCmBgYHtyfQoKIyBDcmVhdGUgYSBsaXN0IG9mIG1hdHJpY2VzIHdpdGggdGhlIEphY2NhcmQgSW5kZXggZm9yIEFHLVRGIGNvLWV4cHJlc3Npb24sIGZvciBlYWNoIFZSCnZuby5tYXQubGlzdCA8LSBsYXBwbHkoVlJzLCBmdW5jdGlvbih2cil7ICAgICMgTG9vcCB0aHJvdWdoIHVuaXF1ZSBWUnMKICAjIENyZWF0ZSBhbiBlbXB0eSBtYXRyaXggZm9yIHRoaXMgVlIgd2l0aCBBR3Mgb24gY29sdW1ucyBhbmQgVEZzIG9uIHJvd3MKICBlbXB0eV9tYXQgPC0gbWF0cml4KGRhdGE9MCxuY29sPWxlbmd0aChBR3MpLG5yb3c9bGVuZ3RoKFRGcykpCiAgcm93bmFtZXMoZW1wdHlfbWF0KSA8LSBURnMKICBjb2xuYW1lcyhlbXB0eV9tYXQpIDwtIEFHcwogICMgU3Vic2V0IG91ciByZXN1bHRzIGZvciByb3dzIHRoYXQgY29udGFpbiB0aGlzIFZSCiAgc3ViLmRmIDwtIHZyLmFnX3RmLnJlc3VsdHNbdnIuYWdfdGYucmVzdWx0cyRWUj09dnIsIF0KICAjIEZvciBvdXIgcmVzdWx0cyBkYXRhIGZyYW1lLCBpdGVyYXRlIG92ZXIgcm93cwogIGZvcihpIGluIDE6bnJvdyhzdWIuZGYpKXsKICAgICMgVGhlIEFHIGZvciB0aGlzIHJvdwogICAgYWcubmFtZSA8LSBzdWIuZGZbaSwgXSRBRwogICAgIyBUaGUgVEYgZm9yIHRoaXMgcm93CiAgICB0Zi5uYW1lIDwtIHN1Yi5kZltpLCBdJFRGCiAgICAjIFRoZSBKYWNjYXJkIEluZGV4IGZvciB0aGlzIEFHIGFuZCB0aGlzIFRGIGZvciB0aGlzIFZSCiAgICBlbXB0eV9tYXRbdGYubmFtZSxhZy5uYW1lXSA8LSBzdWIuZGZbaSwgXSRqYWNjYXJkLmluZGV4CiAgfQogIHJldHVybihlbXB0eV9tYXQpICAgICMgUmV0dXJuIHRoZSBtYXRyaXggZm9yIHRoaXMgVlIKfSkKIyBOYW1lIG1hdHJpY2VzIGZvciB0aGVpciBWUgpuYW1lcyh2bm8ubWF0Lmxpc3QpIDwtIFZScwoKYGBgCgpgYGB7cn0KCiMgQ29udmVydCBhbGwgbWF0cmljZXMgdG8gdmVjdG9ycyBhbmQgY2hlY2sgdGhlaXIgcGVhcnNvbiBjb3JyZWxhdGlvbgp2bm8udmVjLm1hdCA8LSBzYXBwbHkodm5vLm1hdC5saXN0LCBhcy52ZWN0b3IpCnZuby5jb3IubWF0IDwtIGNvcih2bm8udmVjLm1hdCkKCmBgYAoKYGBge3J9CgpmaWc3X2EuY29sb3JzIDwtIHdlc2FuZGVyc29uOjp3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzEiKQojIENyZWF0ZSBhIHJvdyBhbm5vdGF0aW9uIGRhdGEgZnJhbWUgZm9yIGZpZ3VyZSA3QQpmaWc3X2Eucm93X2Fubm90YXRpb25zIDwtIHNhcHBseShyb3duYW1lcyh2bm8uY29yLm1hdCksIGZ1bmN0aW9uKHJlYyl7CiAgaWYoc3RhcnRzV2l0aCh4PXJlYyxwcmVmaXg9IkZwciIpKXsKICAgIHJldHVybigiRnByIikKICB9IGVsc2UgaWYoc3RhcnRzV2l0aCh4PXJlYyxwcmVmaXg9Ik9sZnIiKSl7CiAgICByZXR1cm4oIk9sZnIiKQogIH0gZWxzZSBpZihzdGFydHNXaXRoKHg9cmVjLHByZWZpeD0iVm1uMXIiKSl7CiAgICByZXR1cm4oIlYxUiIpCiAgfSBlbHNlIGlmKHN0YXJ0c1dpdGgoeD1yZWMscHJlZml4PSJWbW4yciIpKXsKICAgIHJldHVybigiVjJSIikKICB9Cn0pCgpmaWc3X2Eucm93X2Fubm90YXRpb25zIDwtIGFzLmRhdGEuZnJhbWUoZmlnN19hLnJvd19hbm5vdGF0aW9ucykKY29sbmFtZXMoZmlnN19hLnJvd19hbm5vdGF0aW9ucykgPC0gInR5cGUiCgpmaWc3X2EuYW5uX2NvbG9ycyA8LSBsaXN0KHR5cGU9YyhGcHI9ZmlnN19hLmNvbG9yc1s1XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xmcj1maWc3X2EuY29sb3JzWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMVI9ZmlnN19hLmNvbG9yc1szXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJSPWZpZzdfYS5jb2xvcnNbNF0pKQoKYGBgCgojIyBDb3JyZWxhdGlvbiBoZWF0bWFwIGJldHdlZW4gcmVjZXB0b3IgdHlwZXMgY2FsY3VsYXRlZCBmcm9tIGNvLWV4cHJlc3NlZCBBRyBhbmQgVEYgZ2VuZXMgIAoKYGBge3IsZmlnLndpZHRoPTEyLGZpZy5oZWlnaHQ9MTJ9CgojIFBsb3QgdGhlIGNyb3NzIFZSLXNwZWNpZmljIGNvcnJlbGF0aW9uIG9mIEFHeFRGIGNvLWV4cHJlc3Npb24KZmlnN19hIDwtCiAgcGhlYXRtYXAodm5vLmNvci5tYXQsZm9udHNpemU9MTYsYW5ub3RhdGlvbl9yb3c9ZmlnN19hLnJvd19hbm5vdGF0aW9ucywgY2VsbHdpZHRoPTMuNiwKICAgICAgICAgICBzaG93X3Jvd25hbWVzPUZBTFNFLHNob3dfY29sbmFtZXM9RkFMU0UsYW5ub3RhdGlvbl9jb2xvcnM9ZmlnN19hLmFubl9jb2xvcnMpCgpgYGAKCiMjIDNEIEhlYXRtYXAgc2hvd2luZyB0aGUgSmFjY2FyZCBJbmRpY2VzIGJldHdlZW4gQUcgYW5kIFRGIGdlbmVzIGZvciBlYWNoIG9mIHRoZSBWUnMgaW4gdGhlIGRhdGFzZXQgIAoKYGBge3J9Cgp2ci5vcmRlci4zZCA8LSByZWFkUkRTKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsInZyLm9yZGVyLjNkLnJkcyIpKQphZy5vcmRlci4zZCA8LSByZWFkUkRTKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsImFnLm9yZGVyLjNkLnJkcyIpKQp0Zi5vcmRlci4zZCA8LSByZWFkUkRTKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsInRmLm9yZGVyLjNkLnJkcyIpKQoKYGBgCgpgYGB7cn0KCiMgTWltaWMgdGhlIGNvbG9yIHNjaGVtZSBvZiBwaGVhdG1hcApmaWc3X3BhbGV0dGUgPC0gY29sb3JSYW1wUGFsZXR0ZShyZXYoUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKG49NywgbmFtZT0iUmRZbEJ1IikpKSgxMDApCiMgU3Vic2V0IG91ciByZXN1bHRzIGRhdGEgZnJhbWUKZmlnN19iLnNjYXR0ZXIuZGYgPC0gdnIuYWdfdGYucmVzdWx0c1sgLGMoIlZSIiwiQUciLCJURiIsImphY2NhcmQuaW5kZXgiKV0KCmBgYAoKYGBge3J9CgojIENvbnZlcnQgY2F0ZWdvcmljYWwgdmFyaWFibGVzIHRvIGZhY3RvcnMKZmlnN19iLnNjYXR0ZXIuZGYkQUcgPC0gZmFjdG9yKGZpZzdfYi5zY2F0dGVyLmRmJEFHLCBsZXZlbHMgPSByZXYoYWcub3JkZXIuM2QpKQpmaWc3X2Iuc2NhdHRlci5kZiRURiA8LSBmYWN0b3IoZmlnN19iLnNjYXR0ZXIuZGYkVEYsIGxldmVscyA9IHJldih0Zi5vcmRlci4zZCkpCmZpZzdfYi5zY2F0dGVyLmRmJFZSIDwtIGZhY3RvcihmaWc3X2Iuc2NhdHRlci5kZiRWUiwgbGV2ZWxzID0gcmV2KHZyLm9yZGVyLjNkKSkKCiMgQ29udmVydCBmYWN0b3JzIHRvIHVuZGVybHlpbmcgbnVtZXJpYyByZXByZXNlbnRhdGlvbgpmaWc3X2Iuc2NhdHRlci5kZiRBR19udW1lcmljIDwtIGFzLm51bWVyaWMoZmlnN19iLnNjYXR0ZXIuZGYkQUcpCmZpZzdfYi5zY2F0dGVyLmRmJFRGX251bWVyaWMgPC0gYXMubnVtZXJpYyhmaWc3X2Iuc2NhdHRlci5kZiRURikKZmlnN19iLnNjYXR0ZXIuZGYkVlJfbnVtZXJpYyA8LSBhcy5udW1lcmljKGZpZzdfYi5zY2F0dGVyLmRmJFZSKQoKIyBQbG90dGluZyB0aGUgM0Qgc2NhdHRlcnBsb3QKc2NhdHRlcjNEKAogIHggPSBmaWc3X2Iuc2NhdHRlci5kZiRBR19udW1lcmljLAogIHkgPSBmaWc3X2Iuc2NhdHRlci5kZiRURl9udW1lcmljLAogIHogPSBmaWc3X2Iuc2NhdHRlci5kZiRWUl9udW1lcmljLAogIGNvbHZhciA9IGZpZzdfYi5zY2F0dGVyLmRmJGphY2NhcmQuaW5kZXgsICAjIENvbG9yIGJ5IGphY2NhcmQuaW5kZXgKICBjb2w9ZmlnN19wYWxldHRlLAogIHBjaCA9IDE5LCAgIyBQb2ludCBzaGFwZQogIHRoZXRhID0gNDUsIHBoaSA9IDMwLCAgIyBWaWV3aW5nIGFuZ2xlCiAgeGxhYiA9ICJBRyIsIHlsYWIgPSAiVEYiLCB6bGFiID0gIlZSIiwgICMgQXhpcyBsYWJlbHMKICBjbGFiID0gIkphY2NhcmQgSW5kZXgiLAogIGNleCA9IDAuMjUgICAgIyBTaHJpbmsgdGhlIHNpemUgb2YgdGhlIGRhdGEgcG9pbnRzCikKCmBgYAoKIyMgSW50ZXJhY3RpdmUgM0QgSGVhdG1hcCBWUi1BRy1URiBKYWNjYXJkIEluZGljZXMgIAoKYGBge3J9CgpwYWxldHRlIDwtIGNvbG9yUmFtcFBhbGV0dGUod2VzYW5kZXJzb246Ondlc19wYWxldHRlKCJaaXNzb3UxIikpCgpzY2F0dGVyM2QuY29sb3JzIDwtIHBhbGV0dGUobj0xMDApCgpgYGAKCgpgYGB7cn0KCnBsb3RseS5zY2F0dGVyLmRmIDwtIHZyLmFnX3RmLnJlc3VsdHNbICxjKCJWUiIsIkFHIiwiVEYiLCJqYWNjYXJkLmluZGV4IildCgp2ci5hZy50Zi5zY2F0dGVyM2QgPC0gcGxvdF9seShkYXRhID0gcGxvdGx5LnNjYXR0ZXIuZGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSB+VEYsIHkgPSB+QUcsIHogPSB+VlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gfmphY2NhcmQuaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICJtYXJrZXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzID0gc2NhdHRlcjNkLmNvbG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gMSwgd2lkdGg9MSksICMgY29udHJvbHMgc2l6ZSBvZiBwb2ludHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXJpbmZvPSJhbGwiKSAlPiUgbGF5b3V0KHRpdGxlPSJWUi1BRy1URiBDby1leHByZXNzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZW5lPWxpc3QoeGF4aXM9bGlzdCh0aXRsZT0nVEYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5b3JkZXI9ImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeWFycmF5PXRmLm9yZGVyLjNkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWF4aXM9bGlzdCh0aXRsZT0nQUcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5b3JkZXI9ImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeWFycmF5PWFnLm9yZGVyLjNkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemF4aXM9bGlzdCh0aXRsZT0nVlInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5b3JkZXI9ImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeWFycmF5PXZyLm9yZGVyLjNkKSkpCgpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MTQsIGZpZy5oZWlnaHQ9MTR9Cgp2ci5hZy50Zi5zY2F0dGVyM2QKCmBgYAoKIyMgSGVhdG1hcHMgc2hvd2luZyBKYWNjYXJkIEluZGljZXMgb2YgVEYtQUcgYXNzb2NpYXRpb25zIGZvciBWMVIgYW5kIFYyUiB0eXBlcy4gVGhlIGxpc3RzIG9mIFRGIGFuZCBBRyBnZW5lcyBoZXJlIGFyZSBhYnJpZGdlZCBmcm9tIHRoZSBmdWxsIGxpc3QgdG8gZW5oYW5jZSB2aXN1YWxpemF0aW9uICAKCmBgYHtyfQoKdnIuZ29pIDwtIGMoIlZtbjFyNjkiLCJWbW4xcjE4NSIsIlZtbjFyMzQiLCJWbW4xcjU2IiwiVm1uMXI2MCIsIlZtbjFyNjEiLCJWbW4ycjEiLAogICAgICAgICAiVm1uMnIzIiwiVm1uMnI3IiwiVm1uMnI3MyIsIlZtbjJyODgiLCJWbW4ycjgiLCJWbW4ycjkxIiwiVm1uMnIxMTgiKQoKYWcuZ29pIDwtIGMoIkZsb3QxIiwiTGdyNCIsIlBjZGg5IiwiS2lycmVsMiIsIkNkazVyMiIsIk5jYW0xIiwiRWZuYTUiLCJOcnAyIiwiQjNnbnQyIiwiUGNkaDEwIiwKICAgICAgICAgICAgIkVwaGE1IiwiUm9ibzIiLCJQY2RoMTciLCJUZW5tMiIsIkdhcDQzIiwiS2lycmVsMyIsIlBseG5kMSIsIkFwcCIsIkJzZyIsIkVmbmEzIikKCnRmLmdvaSA8LSBjKCJUcnBzMSIsIlBieDIiLCJNZWlzMiIsIk5maXgiLCJUZmFwMmUiLCJQb3UyZjEiLCJCYXRmMyIsIlRjZjQiLCJTcDgiLCJDZWJwYiIsCiAgICAgICAgICAgICJOaGxoMSIsIkZveGcxIiwiRm94cDEiLCJBdGY1IiwiSnVuZCIsIkViZjIiLCJFYmYzIiwiS2xmNyIsIkVteDIiLCJJa3pmNCIpCgpmaWx0ZXJlZC52ci5hZ190Zi5yZXN1bHRzIDwtIHZyLmFnX3RmLnJlc3VsdHNbdnIuYWdfdGYucmVzdWx0cyRWUiAlaW4lIHZyLmdvaSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyLmFnX3RmLnJlc3VsdHMkQUcgJWluJSBhZy5nb2kgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ci5hZ190Zi5yZXN1bHRzJFRGICVpbiUgdGYuZ29pLCBdCgpgYGAKCmBgYHtyfQoKdnIub3JkZXIuM2QuZmlsdGVyZWQgPC0gdnIub3JkZXIuM2RbdnIub3JkZXIuM2QgJWluJSB2ci5nb2ldCmFnLm9yZGVyLjNkLmZpbHRlcmVkIDwtIGFnLm9yZGVyLjNkW2FnLm9yZGVyLjNkICVpbiUgYWcuZ29pXQp0Zi5vcmRlci4zZC5maWx0ZXJlZCA8LSB0Zi5vcmRlci4zZFt0Zi5vcmRlci4zZCAlaW4lIHRmLmdvaV0KCmBgYAoKYGBge3J9CgpmaWx0ZXJlZC52bm8ubWF0Lmxpc3QgPC0gbGFwcGx5KHZyLm9yZGVyLjNkLmZpbHRlcmVkLCBmdW5jdGlvbih2cil7CiAgZW1wdHlfbWF0IDwtIG1hdHJpeChkYXRhPTAsbmNvbD1sZW5ndGgoYWcub3JkZXIuM2QuZmlsdGVyZWQpLG5yb3c9bGVuZ3RoKHRmLm9yZGVyLjNkLmZpbHRlcmVkKSkKICByb3duYW1lcyhlbXB0eV9tYXQpIDwtIHRmLm9yZGVyLjNkLmZpbHRlcmVkCiAgY29sbmFtZXMoZW1wdHlfbWF0KSA8LSBhZy5vcmRlci4zZC5maWx0ZXJlZAogIHN1Yi5kZiA8LSBmaWx0ZXJlZC52ci5hZ190Zi5yZXN1bHRzW2ZpbHRlcmVkLnZyLmFnX3RmLnJlc3VsdHMkVlI9PXZyLCBdCiAgZm9yKGkgaW4gMTpucm93KHN1Yi5kZikpewogICAgYWcubmFtZSA8LSBzdWIuZGZbaSwgXSRBRwogICAgdGYubmFtZSA8LSBzdWIuZGZbaSwgXSRURgogICAgZW1wdHlfbWF0W3RmLm5hbWUsYWcubmFtZV0gPC0gc3ViLmRmW2ksIF0kamFjY2FyZC5pbmRleAogIH0KICByZXR1cm4oZW1wdHlfbWF0KQp9KQpuYW1lcyhmaWx0ZXJlZC52bm8ubWF0Lmxpc3QpIDwtIHZyLm9yZGVyLjNkLmZpbHRlcmVkCgpgYGAKCmBgYHtyfQoKIyBSZS1vcmRlciB0aGUgbWF0cmljZXMgYnkgb3VyIG5ldyBhZyBhbmQgdGYgb3JkZXJzCmZpbHRlcmVkLnZuby5tYXQubGlzdCA8LSBsYXBwbHkoZmlsdGVyZWQudm5vLm1hdC5saXN0LCBmdW5jdGlvbihtYXQpewogIG1hdCA8LSBtYXRbdGYub3JkZXIuM2QuZmlsdGVyZWQsYWcub3JkZXIuM2QuZmlsdGVyZWRdCiAgcmV0dXJuKG1hdCkKfSkKCmBgYAoKYGBge3IsZmlnLndpZHRoPTE4LGZpZy5oZWlnaHQ9Nn0KCiMgQ29ycmVsYXRlZCBWMVJzIChUaGVsbWEpClZtbjFyMTg1IDwtIHBoZWF0bWFwKGZpbHRlcmVkLnZuby5tYXQubGlzdCRWbW4xcjE4NSwgZm9udHNpemUgPSAxNiwgY2x1c3Rlcl9jb2xzID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgbWFpbj0iVm1uMXIxODUiLCBzaG93X3Jvd25hbWVzID0gRkFMU0UsIHNpbGVudD1UUlVFKQpWbW4xcjM0IDwtIHBoZWF0bWFwKGZpbHRlcmVkLnZuby5tYXQubGlzdCRWbW4xcjM0LCBmb250c2l6ZSA9IDE2LCBjbHVzdGVyX2NvbHMgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIG1haW49IlZtbjFyMzQiLCBzaG93X3Jvd25hbWVzID0gRkFMU0UsIHNpbGVudD1UUlVFKQpWbW4xcjY5IDwtIHBoZWF0bWFwKGZpbHRlcmVkLnZuby5tYXQubGlzdCRWbW4xcjY5LCBmb250c2l6ZSA9IDE2LCBjbHVzdGVyX2NvbHMgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIG1haW49IlZtbjFyNjkiLCBzaWxlbnQ9VFJVRSkKCmdyaWQuYXJyYW5nZShWbW4xcjE4NVtbNF1dLCBWbW4xcjM0W1s0XV0sIFZtbjFyNjlbWzRdXSwgbmNvbCA9IDMsIHdpZHRocz1jKDEsMSwxLjE0KSkKCmBgYAoKYGBge3IsZmlnLndpZHRoPTE4LGZpZy5oZWlnaHQ9Nn0KClZtbjFyNTYgPC0gcGhlYXRtYXAoZmlsdGVyZWQudm5vLm1hdC5saXN0JFZtbjFyNTYsIGZvbnRzaXplID0gMTYsIGNsdXN0ZXJfY29scyA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIG1haW49IlZtbjFyNTYiLCBzaG93X3Jvd25hbWVzID0gRkFMU0UsIHNpbGVudD1UUlVFKQpWbW4xcjYwIDwtIHBoZWF0bWFwKGZpbHRlcmVkLnZuby5tYXQubGlzdCRWbW4xcjYwLCBmb250c2l6ZSA9IDE2LCBjbHVzdGVyX2NvbHMgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIG1haW49IlZtbjFyNjAiLCBzaG93X3Jvd25hbWVzID0gRkFMU0UsIHNpbGVudD1UUlVFKQpWbW4xcjYxIDwtIHBoZWF0bWFwKGZpbHRlcmVkLnZuby5tYXQubGlzdCRWbW4xcjYxLCBmb250c2l6ZSA9IDE2LCBjbHVzdGVyX2NvbHMgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIG1haW49IlZtbjFyNjEiLCBzaWxlbnQ9VFJVRSkKCgojc3ZnbGl0ZShmaWxlbmFtZSA9IHBhc3RlMChpbWFnZV9kaXIsImZpZzdfZC5zdmciKSx3aWR0aD0yNCxoZWlnaHQ9OCkKZ3JpZC5hcnJhbmdlKFZtbjFyNTZbWzRdXSwgVm1uMXI2MFtbNF1dLCBWbW4xcjYxW1s0XV0sIG5jb2wgPSAzLCB3aWR0aHM9YygxLDEsMS4xNCkpCiNpbnZpc2libGUoZGV2Lm9mZigpKQoKYGBgCgpgYGB7cixmaWcud2lkdGg9MTgsZmlnLmhlaWdodD02fQoKVm1uMnIxIDwtIHBoZWF0bWFwKGZpbHRlcmVkLnZuby5tYXQubGlzdCRWbW4ycjEsIGZvbnRzaXplID0gMTYsIGNsdXN0ZXJfY29scyA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIG1haW49IlZtbjJyMSIsIHNob3dfcm93bmFtZXMgPSBGQUxTRSwgc2lsZW50PVRSVUUpClZtbjJyMyA8LSBwaGVhdG1hcChmaWx0ZXJlZC52bm8ubWF0Lmxpc3QkVm1uMnIzLCBmb250c2l6ZSA9IDE2LCBjbHVzdGVyX2NvbHMgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIG1haW49IlZtbjJyMyIsIHNob3dfcm93bmFtZXMgPSBGQUxTRSwgc2lsZW50PVRSVUUpClZtbjJyNyA8LSBwaGVhdG1hcChmaWx0ZXJlZC52bm8ubWF0Lmxpc3QkVm1uMnI3LCBmb250c2l6ZSA9IDE2LCBjbHVzdGVyX2NvbHMgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIG1haW49IlZtbjJyNyIsIHNpbGVudD1UUlVFKQoKCiNzdmdsaXRlKGZpbGVuYW1lID0gcGFzdGUwKGltYWdlX2RpciwiZmlnN19lLnN2ZyIpLHdpZHRoPTI0LGhlaWdodD04KQpncmlkLmFycmFuZ2UoVm1uMnIxW1s0XV0sIFZtbjJyM1tbNF1dLCBWbW4ycjdbWzRdXSwgbmNvbCA9IDMsIHdpZHRocz1jKDEsMSwxLjE0KSkKI2ludmlzaWJsZShkZXYub2ZmKCkpCgpgYGAKCmBgYHtyLGZpZy53aWR0aD0xOCxmaWcuaGVpZ2h0PTZ9CgpWbW4ycjggPC0gcGhlYXRtYXAoZmlsdGVyZWQudm5vLm1hdC5saXN0JFZtbjJyOCwgZm9udHNpemUgPSAxNiwgY2x1c3Rlcl9jb2xzID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgbWFpbj0iVm1uMnI4Iiwgc2hvd19yb3duYW1lcyA9IEZBTFNFLCBzaWxlbnQ9VFJVRSkKVm1uMnI3MyA8LSBwaGVhdG1hcChmaWx0ZXJlZC52bm8ubWF0Lmxpc3QkVm1uMnI3MywgZm9udHNpemUgPSAxNiwgY2x1c3Rlcl9jb2xzID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCBtYWluPSJWbW4ycjczIiwgc2hvd19yb3duYW1lcyA9IEZBTFNFLCBzaWxlbnQ9VFJVRSkKVm1uMnI4OCA8LSBwaGVhdG1hcChmaWx0ZXJlZC52bm8ubWF0Lmxpc3QkVm1uMnI4OCwgZm9udHNpemUgPSAxNiwgY2x1c3Rlcl9jb2xzID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCBtYWluPSJWbW4ycjg4Iiwgc2lsZW50PVRSVUUpCgoKI3N2Z2xpdGUoZmlsZW5hbWUgPSBwYXN0ZTAoaW1hZ2VfZGlyLCJmaWc3X2Yuc3ZnIiksd2lkdGg9MjQsaGVpZ2h0PTgpCmdyaWQuYXJyYW5nZShWbW4ycjhbWzRdXSwgVm1uMnI3M1tbNF1dLCBWbW4ycjg4W1s0XV0sIG5jb2wgPSAzLCB3aWR0aHM9YygxLDEsMS4xNCkpCiNpbnZpc2libGUoZGV2Lm9mZigpKQoKYGBgCgpgYGB7cixmaWcud2lkdGg9MTAsZmlnLmhlaWdodD01fQoKVm1uMnI5MSA8LSBwaGVhdG1hcChmaWx0ZXJlZC52bm8ubWF0Lmxpc3QkVm1uMnI5MSwgZm9udHNpemUgPSAxNiwgY2x1c3Rlcl9jb2xzID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgbWFpbj0iVm1uMnI5MSIsIHNob3dfcm93bmFtZXMgPSBGQUxTRSwgc2lsZW50PVRSVUUpClZtbjJyMTE4IDwtIHBoZWF0bWFwKGZpbHRlcmVkLnZuby5tYXQubGlzdCRWbW4ycjExOCwgZm9udHNpemUgPSAxNiwgY2x1c3Rlcl9jb2xzID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCBtYWluPSJWbW4ycjExOCIsIHNpbGVudD1UUlVFKQoKI3N2Z2xpdGUoZmlsZW5hbWUgPSBwYXN0ZTAoaW1hZ2VfZGlyLCJmaWc3X2cuc3ZnIiksd2lkdGg9MTYsaGVpZ2h0PTgpCmdyaWQuYXJyYW5nZShWbW4ycjkxW1s0XV0sIFZtbjJyMTE4W1s0XV0sIG5jb2wgPSAyLCB3aWR0aHM9YygxLDEuMTQpKQojaW52aXNpYmxlKGRldi5vZmYoKSkKCmBgYAoKIyBEYXRhIFRhYmxlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzfSAgCgojIyBTaWduaWZpY2FudCBWUiBjby1leHByZXNzaW9uICAKCmBgYHtyfQoKIyBMb2FkIHRoZSBzaWduaWZpY2FudCBjby1leHByZXNzaW9uIGRhdGEgZnJhbWVzCnNpZy52ci5jb2V4cHJlc3Npb24gPC0gb3Blbnhsc3g6OnJlYWQueGxzeCh4bHN4RmlsZT1wYXN0ZTAob2JqZWN0X2Rpciwic2lnLm1WU04uY28ueGxzeCIpKQpzaWcudnIuY29leHByZXNzaW9uCgpgYGAKCiMjIFNpZ25pZmljYW50IFZSIC8gQUcgQ28tZXhwcmVzc2lvbiAgCgpgYGB7cn0KCnNpZy52ci5hZy5jb2V4cHJlc3Npb24gPC0gb3Blbnhsc3g6OnJlYWQueGxzeCh4bHN4RmlsZT1wYXN0ZTAob2JqZWN0X2Rpciwic2lnLnZyLmFnLmNvZXhwcmVzc2lvbi54bHN4IikpCnNpZy52ci5hZy5jb2V4cHJlc3Npb24KCmBgYAoKIyMgU2lnbmlmaWNhbnQgVlIgLyBURiBDby1leHByZXNzaW9uICAKCmBgYHtyfQoKc2lnLnZyLnRmLmNvZXhwcmVzc2lvbiA8LSBvcGVueGxzeDo6cmVhZC54bHN4KHhsc3hGaWxlPXBhc3RlMChvYmplY3RfZGlyLCJzaWcudnIudGYuY29leHByZXNzaW9uLnhsc3giKSkKc2lnLnZyLnRmLmNvZXhwcmVzc2lvbgoKYGBgCgojIyBWUi1zcGVjaWZpYyBBRyAvIFRGIGNvLWV4cHJlc3Npb24gIAoKYGBge3J9Cgp2ci5hZ190Zi5yZXN1bHRzIDwtIG9wZW54bHN4OjpyZWFkLnhsc3goeGxzeEZpbGU9cGFzdGUwKG9iamVjdF9kaXIsInZyLmFnX3RmLnJlc3VsdHMueGxzeCIpKQp2ci5hZ190Zi5yZXN1bHRzCgpgYGAKCmBgYHtyfQoKIyBEaWZmZXJlbnRpYWwgRXhwcmVzc2lvbiBvZiBHZW5lcyBBY3Jvc3MgQ2VsbC1UeXBlcwpWMVJfaVZTTl9WMlJfaVZTTi5ERUdzIDwtIAogIHJlYWQueGxzeCh4bHN4RmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJWMVJfaVZTTl9WMlJfaVZTTi5ERUdzLnhsc3giKSxyb3dOYW1lcz1UUlVFKQpWMVJfbVZTTl9WMlJfbVZTTi5ERUdzIDwtIAogIHJlYWQueGxzeCh4bHN4RmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJWMVJfbVZTTl9WMlJfbVZTTi5ERUdzLnhsc3giKSxyb3dOYW1lcz1UUlVFKQp1bmtub3duX21WU05fVjFSX21WU04uREVHcyA8LSAKICByZWFkLnhsc3goeGxzeEZpbGUgPSBwYXN0ZTAob2JqZWN0X2RpciwidW5rbm93bl9tVlNOX1YxUl9tVlNOLkRFR3MueGxzeCIpLHJvd05hbWVzPVRSVUUpCnVua25vd25fbVZTTl9WMlJfbVZTTi5ERUdzIDwtIAogIHJlYWQueGxzeCh4bHN4RmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJ1bmtub3duX21WU05fVjJSX21WU04uREVHcy54bHN4Iikscm93TmFtZXM9VFJVRSkKCmBgYAoKIyMgVjFSX2lWU04gdnMgVjJSX2lWU04gZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIChERUdzKSAgCgpgYGB7cn0KVjFSX2lWU05fVjJSX2lWU04uREVHcwpgYGAKCiMjIFYxUl9tVlNOIHZzIFYyUl9tVlNOIERFR3MgIAoKYGBge3J9ClYxUl9tVlNOX1YyUl9tVlNOLkRFR3MKYGBgCgojIyBzVlNOIHZzIFYxUl9tVlNOIERFR3MgIAoKYGBge3J9CnVua25vd25fbVZTTl9WMVJfbVZTTi5ERUdzCmBgYAoKIyMgc1ZTTiB2cyBWMlJfbVZTTiBERUdzICAKCmBgYHtyfQp1bmtub3duX21WU05fVjJSX21WU04uREVHcwpgYGAKCiMjIEVhcmx5IElOUCAtIFYxUiB2cyBWMlIgIAoKYGBge3J9CgojIExvYWQgdGhlIHNpZ25pZmljYW50IGNvLWV4cHJlc3Npb24gZGF0YSBmcmFtZXMKZWFybHlfSU5QLnYxcl92MnIuREVHcyA8LSBvcGVueGxzeDo6cmVhZC54bHN4KHhsc3hGaWxlPXBhc3RlMChvYmplY3RfZGlyLCJ2MXIudi52MnIuaW5wMS5tYXJrZXJzLnhsc3giKSkKZWFybHlfSU5QLnYxcl92MnIuREVHc1tlYXJseV9JTlAudjFyX3Yyci5ERUdzJHBfdmFsX2Fkajw9MC4wNSwgXQoKYGBgCgojIyBMYXRlIElOUCAtIFYxUiB2cyBWMlIgIAoKYGBge3J9CgojIExvYWQgdGhlIHNpZ25pZmljYW50IGNvLWV4cHJlc3Npb24gZGF0YSBmcmFtZXMKbGF0ZV9JTlAudjFyX3Yyci5ERUdzIDwtIG9wZW54bHN4OjpyZWFkLnhsc3goeGxzeEZpbGU9cGFzdGUwKG9iamVjdF9kaXIsInYxci52LnYyci5pbnAyLm1hcmtlcnMueGxzeCIpKQpsYXRlX0lOUC52MXJfdjJyLkRFR3NbbGF0ZV9JTlAudjFyX3Yyci5ERUdzJHBfdmFsX2FkaiA8PSAwLjA1LCBdCgpgYGAKCg==